package com.cskaoyan.javase._2inner._5anonymous._1notice;

/**
 * 匿名内部类的语法:
 *  new 类名或者接口名(){
 *    // 某类名或接口名的子类的类体
 *  };
 * 思考:
 *      匿名内部类语法中的"()"是语法格式,还是有含义的呢?它有没有用呢?
 *      有用,是给父类构造器传参的!!!
 *      不是给匿名子类构造器传参的!!!
 *
 * 思考:
 *      1.如果匿名内部类创建的是接口的子类对象
 *          那么"()"有用吗?
 *          没有用,因为接口没有构造器
 *          如果匿名内部类创建的是接口的子类对象
 *          那么语法中"()"就是语法格式,没有任何意义
 *
 *
 *      2."()"既然是给父类构造器传参,那么匿名子类构造器呢?怎么传参呢?
 *      匿名内部类的语法,没有办法给匿名子类构造器传参
 *      所以匿名内部类没有构造器,因为即便有,也没办法用
 *      这是匿名内部类和局部内部类有区别的地方.
 *
 *
 * @since 11:45
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 用匿名内部类创建BaseA的匿名子类对象
        new BaseA(10, 20) {
            // BaseA的匿名子类的类体
            @Override
            public void test() {
                System.out.println("hello world!");
                System.out.println(a);
                System.out.println(b);
            }
        }.test();

        // 用匿名内部类创建IA的匿名子类对象
        new IA(){
            // IA的匿名子类的类体
            int a;
            // 匿名内部类没有构造器!!
            // 成员内部类
            class A{

            }
        };
    }
}
interface IA{}
abstract class BaseA {
    int a;
    int b;

    public BaseA(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public abstract void test();
}